////////////////////////////////////////////////////////////////////
//
// NO_Plugin.h header for the NO_Plugin class.
//
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#ifndef NO_Plugin_H
#define NO_Plugin_H

//////////////////////////////////////////////////////////////////////////
#include "NO_Includes.h"

//////////////////////////////////////////////////////////////////////////
// class NO_Plugin definition
//////////////////////////////////////////////////////////////////////////
class NO_DLL_TAL NO_Plugin  
{
public:
	//////////////////////////////////////////////////////////////////////
	typedef NO_IDSet<NO_Plugin, 3>	Plugins;
	typedef Plugins::iterator		iterator;

	//////////////////////////////////////////////////////////////////////////
	static NO_Plugin* define(const NO_Int8*);
	virtual~NO_Plugin();

	//////////////////////////////////////////////////////////////////////////
	// retrieve
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	const std::string&	getName			(void) const;
	const NO_TypeList&	getTypes		(void) const;
		  NO_UInt32		getID			(void) const;

	//////////////////////////////////////////////////////////////////////////
	static iterator getBegin(void);
	static iterator getEnd	(void);
	static iterator getNext	(iterator);

private:
	//////////////////////////////////////////////////////////////////////
	// con/destruction
	//////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	NO_Plugin(const NO_Int8* name, NO_UInt32 id);
	NO_Plugin(const NO_Plugin& rhs);

	//////////////////////////////////////////////////////////////////////////
	// friends
	//////////////////////////////////////////////////////////////////////////
	
	//////////////////////////////////////////////////////////////////////////
	friend class NO_Type;
	friend void unload(void);
	
	//////////////////////////////////////////////////////////////////////////
	// modify
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	void addType(const NO_Type& info);

	//////////////////////////////////////////////////////////////////////
	NO_Plugin& operator=(const NO_Plugin& rhs);

	//////////////////////////////////////////////////////////////////////
	static Plugins plugins;

	//////////////////////////////////////////////////////////////////////
	NO_TypeList types;
	NO_UInt32 id;
	std::string name;
};

#endif 
